<HTML><HEAD><TITLE>min_max(+Goal, ?Template, ?Solution, ?C)</TITLE>
</HEAD><BODY>[ <A HREF="index.html">library(fd)</A> | <A HREF="../../index.html">Reference Manual</A> | <A HREF="../../fullindex.html">Alphabetic Index</A> ]
<H1>min_max(+Goal, ?Template, ?Solution, ?C)</H1>
Find the solution of Goal that minimizes the maximum of elements of C,
and unify the minimized Template with Solution.


<DL>
<DT><EM>+Goal</EM></DT>
<DD>A callable term.
</DD>
<DT><EM>?Template</EM></DT>
<DD>A term containing all or some of Goal's variables
</DD>
<DT><EM>?Solution</EM></DT>
<DD>Term to be unified with the minimized Template
</DD>
<DT><EM>?C</EM></DT>
<DD>A linear term or a list of linear terms.
</DD>
</DL>
<H2>Description</H2>
   If C is a linear term, a solution of the goal Goal is found that
   minimizes the value of C. If C is a list of linear terms, the returned
   solution minimizes the maximum value of terms in the list.  The solution
   is found using the branch and bound method; as soon as a partial
   solution is found that is worse than a previous solution, the search is
   abandoned and a new solution is searched for.  Every time a new better
   solution is found, the event 280 is raised, its default handler prints
   the current cost.

<P>
   Solutions will be unified with a copy of Template where the variables
   are replaced with their minimized values. Typically, the Template will
   contain all or a subset of Goal's variables.

<P>
   min_max/2 can be written in terms of min_max/4 as follows:

<P>
<PRE>
	min_max(Goal, Cost) :-
	    min_max(Goal, Goal, Goal, Cost).
</PRE>

<H3>Fail Conditions</H3>
   Fails if there is no solution to Goal.


<H3>Resatisfiable</H3>
   No.
<H2>Examples</H2>
<PRE>
    % Find the minimal C and bind X to the corresponding value
    [eclipse]: X::1..3, C #= 3-X, min_max(indomain(X), X, X, C).
    Found a solution with cost 2
    Found a solution with cost 1
    Found a solution with cost 0
    X = 3
    C = 0
    yes.

    % Find the minimal C and don't bind anything
    [eclipse]: X::1..3, C #= 3-X, min_max(indomain(X), [], [], C).
    Found a solution with cost 2
    Found a solution with cost 1
    Found a solution with cost 0
    X = X{[1..3]}
    C = C{[0..2]}

    Delayed goals:
	    -3 + X{[1..3]} + C{[0..2]}#=0
    yes.

    % Find the minimal C and return it in MinC. Don't bind X or C.
    [eclipse]: X::1..3, C #= 3-X, min_max(indomain(X), C, MinC, C).
    Found a solution with cost 2
    Found a solution with cost 1
    Found a solution with cost 0
    X = X{[1..3]}
    MinC = 0
    C = C{[0..2]}

    Delayed goals:
	    -3 + X{[1..3]} + C{[0..2]}#=0
    yes.




</PRE>
<H2>See Also</H2>
<A HREF="../../lib/fd/min_max-2.html">min_max / 2</A>, <A HREF="../../lib/fd/min_max-5.html">min_max / 5</A>, <A HREF="../../lib/fd/min_max-6.html">min_max / 6</A>, <A HREF="../../lib/fd/min_max-8.html">min_max / 8</A>, <A HREF="../../lib/fd/minimize-2.html">minimize / 2</A>, <A HREF="../../lib/fd/minimize-4.html">minimize / 4</A>, <A HREF="../../lib/fd/minimize-5.html">minimize / 5</A>, <A HREF="../../lib/fd/minimize-6.html">minimize / 6</A>, <A HREF="../../lib/fd/minimize-8.html">minimize / 8</A>
</BODY></HTML>
